package cn.xjt.Unsafe;

/**
 * 死锁的一个案例，会卡死程序
 * 进行一个调整就好了
 * @author xujiangtao
 * @create 2020-08-01-16:29
 */
public class deadLock {
    public static void main(String[] args) {
        Makeup makeup =new Makeup(0,"小红");
        Makeup makeup1 =new Makeup(1,"小花");
        makeup.start();
        makeup1.start();
    }
}
//口红类
class lipstick{

}
//镜子类
class mirror{

}
class Makeup extends Thread{

    static lipstick l = new lipstick();//口红，static静态，表示只有一个
    static mirror m = new mirror();//镜子，static静态，表示只有一个
    private int choice;             //选择
    String girlName;                //使用镜子的人
    public Makeup(int choice,String girlName)       //对象的构造方法
    {
        this.choice=choice;
        this.girlName=girlName;
    }

    public void run() {
        //开始化妆
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //化妆方法
    private void makeup() throws InterruptedException {
        if(choice==0)
        {
            synchronized (l)
            {
                System.out.println(girlName+"\t获得了口红，需要一个镜子");
                Thread.sleep(1000);     //休息一秒钟
            }
            //当使用完口红应该释放口红的锁，再去得到镜子的锁
            //去拿到镜子的锁
            synchronized (m)
            {
                System.out.println(girlName+"\t拿到了镜子，化妆 完成");
            }
        }else
        {
            synchronized (m)
            {
                System.out.println(girlName+"\t拿到了一个镜子，需要一个口红");
                Thread.sleep(1000);
                //去拿到口红
                synchronized (l)
                {
                    System.out.println(girlName+"拿到了口红，完成了化妆");
                }
            }
        }
    }
}
